package day27.homework;

/**
 * 线程状态演示类
 * 展示线程经历的不同状态：NEW、RUNNABLE、TIMED_WAITING和TERMINATED
 * 
 * Java线程的生命周期包括以下状态：
 * 1. NEW：线程被创建但尚未启动
 * 2. RUNNABLE：线程正在Java虚拟机中执行
 * 3. BLOCKED：线程被阻塞等待监视器锁
 * 4. WAITING：线程无限期等待其他线程执行特定操作
 * 5. TIMED_WAITING：线程等待另一个线程执行操作，但最多等待指定时间
 * 6. TERMINATED：线程已退出
 */
public class hw13 {
    /**
     * 程序主入口方法
     * @param args 命令行参数
     * @throws InterruptedException 当线程等待时可能被中断抛出此异常
     */
    public static void main(String[] args) throws InterruptedException {
        // 创建一个新的线程实例，传入实现了Runnable接口的任务对象
        // 此时线程处于NEW状态，表示线程已被创建但尚未调用start()方法启动
        Thread thread = new Thread(new RunnableTask(), "状态演示线程");
        // 调用getState()方法获取线程当前状态并打印
        System.out.println("线程创建后，当前状态: " + thread.getState()); // NEW

        // 调用start()方法启动线程，使线程进入RUNNABLE状态
        // RUNNABLE状态表示线程正在Java虚拟机中运行或准备运行
        thread.start();
        // 打印线程启动后的状态
        System.out.println("线程启动后，当前状态: " + thread.getState()); // RUNNABLE

        // 主线程休眠1秒，目的是让thread线程有足够时间执行到sleep方法
        // 这样可以观察到thread线程进入TIMED_WAITING状态
        Thread.sleep(1000);
        // 打印thread线程在执行sleep时的状态
        System.out.println("线程执行sleep时，当前状态: " + thread.getState()); // TIMED_WAITING

        // 调用join()方法，使主线程等待thread线程执行完毕
        // join()方法会阻塞当前线程直到thread线程终止
        thread.join();
        // 打印thread线程执行完毕后的状态
        System.out.println("线程执行完毕后，当前状态: " + thread.getState()); // TERMINATED
    }

    /**
     * 实现Runnable接口的任务类
     * 该类定义了线程执行的具体任务内容
     */
    static class RunnableTask implements Runnable {
        /**
         * 重写run方法，定义线程需要执行的任务
         * run方法是线程执行的入口点
         */
        @Override
        public void run() {
            try {
                // 在线程内部打印当前线程的状态
                // 此时线程处于RUNNABLE状态，正在执行run方法
                System.out.println("在线程内部，当前线程状态: " + Thread.currentThread().getState());
                // 调用Thread.sleep(3000)方法使当前线程休眠3秒
                // sleep方法会使线程进入TIMED_WAITING状态，这是一种有限时间的等待状态
                // 在等待期间，线程不会占用CPU资源
                Thread.sleep(3000);
                // 线程从sleep中醒来后继续执行，打印提示信息
                System.out.println("线程休眠结束");
            } catch (InterruptedException e) {
                // 捕获InterruptedException异常，当线程在sleep/wait等等待状态中被中断时会抛出此异常
                System.out.println("线程被中断");
                // 重新设置线程的中断状态，这是一种良好的编程实践
                // 调用interrupt()方法可以恢复线程的中断状态，以便调用栈上层的代码能检测到中断
                Thread.currentThread().interrupt();
            }
        }
    }
}